home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 4
/
Amiga Tools 4.iso
/
tools
/
system-tools
/
grabkick
/
grabkick.a
< prev
next >
Wrap
Text File
|
1996-02-15
|
5KB
|
174 lines
;**** GrabKick.a ******************************************
NOLIST
INCDIR AINCLUDE:
INCLUDE libraries/dosextens.i
INCLUDE lvo.i
INCLUDE dos/dos.i
INCLUDE exec/execbase.i
INCLUDE workbench/startup.i
INCLUDE workbench/workbench.i
INCLUDE libraries/asl.i
LIST
; Programmheader
;
; Name: GrabKick
; Author: SDI
; Distribution: PD
; Description: liest Kickstart aus und schreibt ihn in Datei
; Compileropts: -
; Linkeropts: -
; CLI-Parameter: FILENAME
;
; 1.2 07.08.95 : neue Berechnung für Revisionsnummer gleicht Rechen-
; fehler von MaxonC++ aus - Länge 880
; 1.3 03.12.95 : Mit Assembler neukompiliert - Länge 244
; 1.4 04.12.95 : etwas verkürzt - Länge 236
; 1.5 10.12.95 : etwas verkürzt - Länge 228
; 1.6 19.12.95 : läuft auch von WB aus - Länge 300
; 1.7 05.01.96 : CLI Parameter Filename eingebaut, Fehler entfernt
; Länge 332
; 1.8 10.02.96 : Asl-Requester bei Workbench-Start, neues Icon - Länge 508
; 1.9 11.02.96 : etwas gekürzt, Text kommentiert - Länge 488
; 1.10 12.02.96 : kleine Änderung - Länge 484
; 1.11 14.02.96 : CMPA.L #0,Ax durch MOVE.L Ax,D0 ersetzt - Länge 476
;**** Programm ********************************************
SECTION "GrabKick",CODE
SUBQ.W #1,D0 ; SUBQ statt Offset -1, da TST statt CMP #1
CLR.B (A0,D0.W) ;Letztes Zeichen 0 - CString
MOVE.L A0,D5 ;D5 - CLI-Parameter Name!
TST.W D0 ;Wenn nur ein Zeichen, dann kein Param. angegeben!
BNE.B .start
MOVEQ #0,D5 ;D5 - löschen, da leer
.start MOVEQ #0,D7 ;D7 - später StartupM! = 0
MOVEA.L 4.W,A6
MOVEA.L ThisTask(A6),A4
TST.L pr_CLI(A4) ;Laufen wir unter WB?
BNE.B .CLI
LEA pr_MsgPort(A4),A0
JSR _LVOWaitPort(A6) ;Warte auf Start-Message
LEA pr_MsgPort(A4),A0
JSR _LVOGetMsg(A6) ;Hole Msg
MOVE.L D0,D7 ;D7 - WBStartUp Message
.CLI LEA KICKEND(PC),A2 ;A2 - KickStr-Ende
MOVEQ #33,D0
LEA DOSNAME(PC),A1
JSR _LVOOpenLibrary(A6) ;Open Dos-Lib
TST.L D0 ;Fataler Fehler : Librarybase = 0?
BEQ.B .goend ;statt BEG.W ENDE (-2 Byte)
MOVEA.L D0,A5 ;A5 - DosBase
TST.L D7
BEQ.B .NoWB
MOVEA.L D7,A0
MOVEA.L sm_ArgList(A0),A0 ;Bei WB-Start Progdir ermitteln
MOVE.L A0,D0 ;statt CMPA.L #0,A0 (-4 Byte)
.goend BEQ.W ENDE
MOVE.L (A0),D1 ;und setzen
MOVEA.L A5,A6
JSR _LVOCurrentDir(A6)
.NoWB LEA $01000000,A3 ;Kick-ROM Ende -> feste Adresse
MOVE.L -20(A3),D3 ;D3 - RomSize
SUBA.L D3,A3 ;A3 - Romstart
MOVE.W 12(A3),D4 ;D4 - Romvers
MULU #1000,D4
ADD.W 14(A3),D4 ;D4 - Fullversion
.LOOP ;kick..... Namen berechnen
MOVE.L D4,D2
DIVU #10,D2 ;durch Zehn teilen
MOVE.W D2,D4 ;Ergebnis nach D4
SWAP D2
ADD.B D2,-(A2) ;Rest in Namensfile
TST.L D4
BNE.B .LOOP
;Schleifenende ;D4 wieder frei
MOVEA.L D5,A2 ;A2 - CLI-Name oder
TST.L D5
BNE.B .GoOn
LEA KICKSTR(PC),A2 ;A2 - kick.....
.GoOn MOVEQ #0,D6 ;D6 - später Asl-Base! = 0
MOVEQ #0,D5 ;D5 - später Lock! = 0
TST.L D7 ;WB ?, dann Asl, sonst normal weiter
BEQ.B Open
MOVEA.L 4.W,A6
LEA ASLNAME(PC),A1
MOVEQ #37,D0
JSR _LVOOpenLibrary(A6) ;Open asl.library
MOVE.L D0,D6 ;D6 - AslBase
BEQ.B Open ;failed ?, dann weiter wie in CLI
MOVEA.L D6,A6
MOVEQ #ASL_FileRequest,D0
LEA TAGITEM(PC),A0
JSR _LVOAllocAslRequest(A6) ;Struktur anlegen
MOVEA.L D0,A4 ;A4 - FileRequester
TST.L D0
BEQ.B Open ;failed ?, dann weiter wie in CLI
MOVEA.L A4,A0
LEA TAGITEM(PC),A1
JSR _LVOAslRequest(A6) ;Requester aufrufen
TST.L D0
BEQ.B CLEANUP ;failed?, dann beenden
MOVE.L fr_Drawer(A4),D1
MOVEQ #SHARED_LOCK,D2 ;Zugriffsmodus
MOVEA.L A5,A6
JSR _LVOLock(A6) ;Lock auf Verzeichnis
MOVE.L D0,D5 ;D5 - Lock
BEQ.B CLEANUP ;failed?, dann beenden
MOVE.L D5,D1
JSR _LVOCurrentDir(A6) ;und dieses als aktuelles Verzeichnis
MOVEA.L fr_File(A4),A2 ;A2 - Asl-Name
Open MOVE.L A2,D1 ;Name-Parameter
MOVE.W #MODE_NEWFILE,D2 ;Modus-Parameter
MOVEA.L A5,A6
JSR _LVOOpen(A6)
MOVE.L D0,D4 ;D4 - Filehandle
BEQ.B CLEANUP
;Anzahl-Parameter D3 hat schon Wert
MOVE.L D4,D1 ;Filehandle-Parameter
MOVE.L A3,D2 ;Puffer-Parameter
JSR _LVOWrite(A6)
MOVE.L D0,D2 ;D2 - Write Rückgabe
MOVE.L D4,D1 ;Filehandle-Parameter
JSR _LVOClose(A6)
CMP.L D3,D2 ;D2 != D3, dann File löschen
BEQ.B CLEANUP
MOVE.L A2,D1
JSR _LVODeleteFile(A6)
CLEANUP
MOVE.L D5,D1
BEQ.B .next
JSR _LVOUnLock(A6) ;Lock freigeben
.next TST.L D6
BEQ.B .clsdos
MOVE.L A4,D0 ;statt CMPA.L #0,A4 (-4 Byte)
BEQ.B .clsasl
MOVEA.L A4,A0
MOVEA.L D6,A6
JSR _LVOFreeAslRequest(A6) ;Filerequester schließen
.clsasl MOVEA.L 4.W,A6
MOVEA.L D6,A1
JSR _LVOCloseLibrary(A6) ;Close Asl
.clsdos MOVEA.L 4.W,A6
MOVEA.L A5,A1
JSR _LVOCloseLibrary(A6) ;Close Dos
ENDE
TST.L D7 ;von Workbench ?
BEQ.B .exit ;nein - war CLI
JSR _LVOForbid(A6) ;Schutzmaßnahme
MOVEA.L D7,A1 ;Message holen
JSR _LVOReplyMsg(A6)
MOVEQ #0,D0
.exit RTS
DOSNAME CSTRING 'dos.library'
ASLNAME CSTRING 'asl.library'
KICKSTR DC.B 'kick00000'
KICKEND DC.B 0
TAGITEM DC.L ASLFR_InitialFile,KICKSTR,0
CSTRING '$VER: GrabKick 1.11 (14.02.96) (PD) by SDI'
END